package cjyyp.buffer;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;

public class ByteBuffer常用api {
    static String filePath = "F:\\LearningMaterials\\netty,nio黑马\\netty\\nio\\src\\main\\resources\\data.txt";
    public static void main(String[] args) throws IOException {
        /**
         * 1：创建ByteBuffer
         */
        //分配的是jvm堆内存，受gc影响
        ByteBuffer byteBuffer = ByteBuffer.allocate(100);
        System.out.println(byteBuffer.getClass());
        //分配的是os直接内存，底层仍是unsafe，注意内存泄漏问题。读写效率高（少一次拷贝）
        ByteBuffer allocateDirect = ByteBuffer.allocateDirect(100);
        System.out.println(allocateDirect.getClass());
        /**
         * 2：往ByteBuffer写数据
         */
        FileChannel fileChannel = new FileInputStream(filePath).getChannel();
        //利用channel
        fileChannel.read(byteBuffer);
        //直接put
        byteBuffer.put((byte) 97);
        /**
         * 3：从ByteBuffer读数据
         */
        //利用channel
        fileChannel.write(byteBuffer);
        //直接get
        //todo get 方法会让 position 读指针向后走，如果想重复读取数据
        //* 可以调用 rewind 方法将 position 重新置为 0
        //* 或者调用 get(int i) 方法获取索引 i 的内容，它不会移动读指针
        byteBuffer.get();
        /**
         * 4：字符串与 ByteBuffer 互转
         */
        //字符串转为bytebuffer
        ByteBuffer buffer1 = StandardCharsets.UTF_8.encode("你好");
        ByteBuffer buffer2 = ByteBuffer.wrap("你好".getBytes(StandardCharsets.UTF_8));
        //bytebuffer转为字符串
        System.out.println(StandardCharsets.UTF_8.decode(buffer1).toString());
        /**
         * 5：ByteBuffer 读/写模式
         */
        byteBuffer.flip();
        byteBuffer.clear();
        byteBuffer.compact();
    }
}
